package org.example;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * @author 90616
 * @description ${DESCRIPTION}
 * @create 2025/6/27 19:53
 */
public class Main {
    public static void main(String[] args) throws IOException, TimeoutException {
        //1.使用ConnectionFactory配置连接
        ConnectionFactory connectionFactory = new ConnectionFactory();

        //2.设定连接信息
        connectionFactory.setHost("192.168.88.100");
        connectionFactory.setPort(5672);
        connectionFactory.setUsername("root");
        connectionFactory.setPassword("1234");
        connectionFactory.setVirtualHost("/test");

//        //创建连接
//        try(Connection connection = connectionFactory.newConnection();
//            Channel channel = connection.createChannel() //通过connection创建新的channel
//        ){
//            //声明消息队列, 如果消息队列不存在, 就会自动创建
//            channel.queueDeclare("testQueue2",false, false, false, null);
//            //将消息队列绑定到交换机
//            channel.queueBind("testQueue2", "amq.direct", "MyTestQueue2");
//            //发布新的消息
//            channel.basicPublish("amq.direct", "MyTestQueue2", null, "HelloWorld!".getBytes());
//
//        }catch (Exception e){
//            e.printStackTrace();
//        }

        //这里不使用try-with-resource，因为消费者是一直等待新的消息到来，然后按照
        //我们设定的逻辑进行处理，所以这里不能在定义完成之后就关闭连接
        Connection connection = connectionFactory.newConnection();
        Channel channel = connection.createChannel();

        //创建一个基本的消费者
        channel.basicConsume("testQueue2", false, (s, delivery) -> {
            System.out.println(new String(delivery.getBody()));
            //basicAck是确认应答，第一个参数是当前的消息标签，后面的参数是
            //是否批量处理消息队列中所有的消息，如果为false表示只处理当前消息
            channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
            //basicNack是拒绝应答，最后一个参数表示是否将当前消息放回队列，如果
            //为false，那么消息就会被丢弃
            //channel.basicNack(delivery.getEnvelope().getDeliveryTag(), false, true);
            //跟上面一样，最后一个参数为false，只不过这里省了
            //channel.basicReject(delivery.getEnvelope().getDeliveryTag(), false);
        }, s -> {});
    }
}